<?php
class Question extends ActiveRecord {
	
	protected $tableName = 'question';
	public $pkName = 'ID_question';
	public $essenceNumberOnPage = 2;			// Количество отображаемых вопросов на одной странице
	
	protected $arrSettings = array(
			'created_at' => true,  // в БД храним время создания
			'updated_at' => true, 	// в БД храним время редактирования
			'author' => true			// в БД храним автора (ID_user)
	);
	public $validatesLengthOf = array(
			'question_name' => array('minimum' => 2, 'maximum' => 256, 'message' => 'Заголовок вопроса слишком короткий'),
			'description' => array('minimum' => 2, 'message' => 'Описание вопроса обязательно')
	);
	
	public function beforeValidationOnCreate () {
		$objSession = User_Session::instance();
		if (!isset($this->tableFields['kaptcha']) || empty($this->tableFields['kaptcha']) || ($objSession->__get('keystring')!=$this->tableFields['kaptcha'])) {
			$error = Service_Translate::getText('Неверный код подтверждения');
			Exception_ActiveRecord::addObjectException(get_class($this), 'kaptcha', $error);
		}
	}
	
	public function beforeValidation() {
		Service_Debug::setDebug();
		
		// В случае добавления вопроса незалогиненным пользователем необходимо зарегистрировать его
		// Добавляем правила заполнения полей для регистрации
		$objSession = User_Session::instance();
		if (!$objSession->isLoggedIn()) {
			$this->validatesLengthOf['first_name'] = array ('minimum' => 2, 'message' => 'Слишком короткое имя');
			$this->validatesLengthOf['last_name'] = array ('minimum' => 2, 'message' => 'Слишком короткая фамилия');
			$this->validatesLengthOf['pass'] = array('minimum' => 6, 'maximum' => 128, 'message' => 'Пароль введен неверно, должен состоять из 6-128 символов', 'on' => 'create');
			$this->validatesFormatOf['e_mail'] =  array('message' => 'Электронная почта заполнена неверно', 'with' => '|^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$|','on' => 'create');
			$this->validatesConfirmationOf['pass'] = array('message' => 'Пароль и его подтверждение не совпадают');
			//$this->validatesAcceptanceOf['confirm'] = array('message' => 'Вы должны быть согласны с условиями', 'on' => 'create');
		}
		
		//Удаляем из сохраняемого массива поля с пустыми значениями
		$arrCheck = $this->tableFields;
		foreach ($arrCheck as $key => $value)
			if ($value=='') $arrCheck[$key] = null;
		$this->tableFields = $arrCheck;
	}
	
	public function beforeCreate() {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		if (!$objSession->isLoggedIn()) {
			// Получаем массив данных для регистрации пользователя
			$copiedFieldsArray = array ('first_name', 'last_name', 'pass', 'pass_confirmation', 'e_mail', 'user_type', 'kaptcha');
			foreach ($copiedFieldsArray as $copiedField) {
				// Получаем массив данных для регистрации пользователя, удаляя их при этом из набора данных вопроса
				$userArray[$copiedField] = $this->tableFields[$copiedField];
				unset($this->tableFields[$copiedField]);
			}
			$objUser = new User_User($userArray);
			$objUser->save();
			$objAuth = new User_Auth();
			$objAuth->signInSuccess($objUser->id);
		}
		if (isset($this->tableFields['kaptcha'])) unset($this->tableFields['kaptcha']);
	}
	
	/**
	 * Функция увеличивает счётчик просмотров вопроса на единицу
	 *
	 */
	public function increaseCounter() {
		$stmt = "UPDATE `question` SET `question`.`viewings`=`question`.`viewings` + 1 WHERE `question`.`ID_question`='" . $this->id . "'";
		$objDB = Service_Database::instance();
		$objDB->query($stmt);
	}
	
	/**
	 * Метод возвращает автора текущего вопроса
	 *  @return array
	 */
	public function getAuthor() {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$stmt = "SELECT `user`.`first_name`,`user`.`last_name`,`user`.`ID_user`,`user`.`user_type`
		FROM `user`
		INNER JOIN  `question` USING(`ID_user`)
		WHERE `question`.`ID_question`='" . $this->id . "'";
		$arrAuthor = $objDB->selectOne($stmt);
		return $arrAuthor;
	}
	
	// Функция отмечает непрочитанные ответы на вопрос , как просмотренные и уменьшает счётчик пользователя по новым ответам
	public function makeRead($notReadAnswers) {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		// Отмечаем все отклики по текущему заказу как прочитанные
		$stmt = "UPDATE `answer` SET `is_read` = 1 WHERE `answer`.`ID_question`='" . $this->id . "'";
		$objDB->query($stmt);
		// Уменьшаем счётчик непрочитанных ответов пользователя
		User_User::changeNumber('-','questionEvents', $this->getField('ID_user'), $notReadAnswers);
	}
	
	// Функция отмечает непрочитанные ответы на вопрос , как просмотренные и уменьшает счётчик пользователя по новым ответам
	public function canAnswer() {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		$objDB = Service_Database::instance();
		$userId = $objSession->getUserId();
		$stmt = "SELECT `answer`.`ID_answer` FROM `answer` WHERE `answer`.`ID_question`='" . $this->id . "' AND `answer`.`ID_user`='" . $objSession->getUserId() . "'";
		// Если текущий пользователь залогинен и он не ещё не отвечал на этот вопрос
		if($userId && !$objDB->selectOne($stmt)) return true;
		else return false;
	}
}
?>